package eu.jucy.connectiondebugger;
import helpers.GH;
import helpers.SizeEnum;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSession;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import uc.protocols.ICryptoInfo;
import logger.LoggerFactory;
public class CryptoInfo implements ICryptoInfo {
public static final Logger logger = LoggerFactory.make(Level.DEBUG);
public static final String ENABLED_CIPHERSUITES = "Enabled Cipher suites"
,CIPHERSUITE = "Ciphersuite used"
,ENABLED_PROTOCOLS = "Enabled Protocols"
,PROTOCOL = "Protocol in use"
,HADNSHAKE_STATUS = "Handshake Status"
,PEER_CERTIFICATES = "Peer certificates"
,SESSION_VALUES = "Session values"
, APPLICATION_BUFFER = "Application Buffer size"
, PACKET_BUFFER = "Packet Buffer size"
,PRINCIPAL = "Principal";
private final List<CryptoInfoEntry> cryptoInfo = new ArrayList<CryptoInfoEntry>();
public List<CryptoInfoEntry> getCryptoInfo() {
return Collections.unmodifiableList(cryptoInfo);
}
public void setInfo(SSLEngine ssle) {
cryptoInfo.clear();
put(ENABLED_CIPHERSUITES , GH.concat(ssle.getEnabledCipherSuites(),", ","-"));
put(ENABLED_PROTOCOLS , GH.concat(ssle.getEnabledProtocols(),", ","-"));
put(HADNSHAKE_STATUS ,ssle.getHandshakeStatus().toString());
SSLSession ssls = ssle.getSession();
try {
put(PEER_CERTIFICATES ,GH.concat(ssls.getPeerCertificates(),"\n---NEW CERT-------\n","-"));
put(PRINCIPAL , ssls.getPeerPrincipal().toString());
} catch (SSLPeerUnverifiedException e) {
logger.debug(e, e);
}
List<String> keyValuePairs = new ArrayList<String>();
for (String s : ssls.getValueNames()) {
keyValuePairs.add(s+"="+ssls.getValue(s));
}
put(SESSION_VALUES , GH.concat(keyValuePairs,", ","-"));
put(CIPHERSUITE, ssls.getCipherSuite());
put(PROTOCOL, ssls.getProtocol());
put(APPLICATION_BUFFER , SizeEnum.getReadableSize(ssls.getApplicationBufferSize())+" ("+ssls.getApplicationBufferSize()+")");
put(PACKET_BUFFER , SizeEnum.getReadableSize(ssls.getPacketBufferSize())+" ("+ssls.getPacketBufferSize()+")");
}
private void put(String key, String value) {
CryptoInfoEntry cie = new CryptoInfoEntry(key, value);
cryptoInfo.add(cie);
}
public static class CryptoInfoEntry {
private final String type;
private final String info;
public CryptoInfoEntry(String type, String info) {
super();
this.type = type;
this.info = info;
}
public String getType() {
return type;
}
public String getInfo() {
return info;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CryptoInfoEntry other = (CryptoInfoEntry) obj;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
return true;
}
}
}